package com.yuw.exceptions;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class TestDriver {
    public static void main(String[] args) {
        // 异常分类
        //test01();
        System.out.println("---------------------------------------------------------");
        test02();
        System.out.println("---------------------------------------------------------");


        try {
            test03(); // 可以继续使用throws向上抛，抛给jvm
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        System.out.println("-------------------throw--------------------------------------");


        try {
            test04(); // 可以继续使用throws向上抛，抛给jvm
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("-------------------throw--------------------------------------");

        test05();
    }

    /**
     * 异常机制的应用
     * 编程题：手动编程，判断一个字符串的长度，不能使用String类的length()方法；
     */
    public static void test05() {
        // 被判定长度的字符串
        String str = "sjkfjsajfdlkjsafja;s";
        // 字符串长度
        int count = -1;
        // 手动判定长度
        try {
            while (true) {
                // 依次取出字符串中的字符，指导发生异常为止
                char ch = str.charAt(++count);
            }
        } catch (Exception e) {
            // 发生了异常
            System.out.println("字符串长度遍历完成");
        }
        System.out.println("字符串：" + str + "    长度：" + count);
    }

    /**
     * 手动抛出异常——throw机制
     */
    public static void test04() throws Exception {
        // 非检查性异常、运行时异常
        int i = 0, j = 1;
        // 手动抛出异常
        if (i == 0) {
            // 手动抛出一个除数为0的异常
            throw new Exception("除数为0，不能进行计算，发生了异常"); // 跳到上层方法调用者中，进行异常处理
        }
        int k = j / i; // 此处发生异常，后续代码不再被执行
        System.out.println("k=" + k);
    }

    /**
     * 异常的处理机制——throws机制
     */
    public static void test03() throws FileNotFoundException {
        FileInputStream fileInputStream = new FileInputStream("第6章-异常的捕获及处理.pptx");
    }

    /**
     * 异常的处理机制——try-catch机制
     */
    public static void test021() {
        // 检查性异常、编译时异常
        FileInputStream fileInputStream = null;
        try {
            // 可能发生异常的代码
            fileInputStream = new FileInputStream("E:\\天软教学相关\\教学安排相关\\教学课件相关\\课件-JD\\课程名称：Java高级程序进阶\\第6章-异常的捕获及处理\\第6章-异常的捕获及处理.pptx");
        } catch (FileNotFoundException | ArithmeticException e) { // jdk1.5+?
            e.printStackTrace(); // 打印方法栈中异常信息
            System.out.println("不好意思，我找不到文件！！！！");
        } finally {
            // 进行资源回收，无论是否发生异常都会执行
            // 资源回收
            if (fileInputStream != null) {
                // 关闭资源又需要进行try-catch处理
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            System.out.println("执行了finally部分");
        }
    }

    /**
     * 异常的处理机制——try-catch机制
     */
    public static void test02() {
        // 检查性异常、编译时异常
        FileInputStream fileInputStream = null;
        try {
            // 可能发生异常的代码
            fileInputStream = new FileInputStream("E:\\天软教学相关\\教学安排相关\\教学课件相关\\课件-JD\\课程名称：Java高级程序进阶\\第6章-异常的捕获及处理\\第6章-异常的捕获及处理.pptx");
        } catch (FileNotFoundException e) {
            e.printStackTrace(); // 打印方法栈中异常信息
            System.out.println("不好意思，我找不到文件！！！！");
        } catch (ArithmeticException e) {
            e.printStackTrace(); // 打印方法栈中异常信息
        } catch (Exception e) { // 范围最大
            e.printStackTrace(); // 打印方法栈中异常信息
        } finally {
            // 进行资源回收，无论是否发生异常都会执行
            // 资源回收
            if (fileInputStream != null) {
                // 关闭资源又需要进行try-catch处理
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            System.out.println("执行了finally部分");
        }
    }

    /**
     * 异常的处理机制——非检查性异常
     */
    public static void test01() {
        // 非检查性异常、运行时异常
        int i = 0, j = 1;
        int k = j / i; // 此处发生异常，后续代码不再被执行
        System.out.println("k=" + k);
    }
}
